package cc.surui.common.event 
{
	/**
	 * ...
	 * @author Surui
	 */
	public class UIEventer 
	{
		public static const START_BUTTON_CLICK:String = "start_button_click";
		private static var listeners:Object = new Object;
		public function UIEventer() 
		{
			
		}
		/**
		 * 添加事件监听
		 * @param	type		事件类型
		 * @param	callback	回调函数
		 */
		public static function addListener( type:String, callback:Function ):void {
			// 获取该事件类型对应的回调函数集合
			var array:Array = listeners[ type ];
			// 如果回调函数集合不存在,则创建,并进行存储
			if ( !array ) {
				array = [];
				listeners[ type ] = array;
			} else {
				// 检查是否已经监听过
				for ( var i:int = 0; i < array.length; i++ ) {
					var fun:Function = array[i];
					if ( fun == callback ) {
						return;
					}
				}
			}
			// 添加事件监听
			array.push( callback );
		}
		/**
		 * 检查是否存在指定事件的监听
		 * @param	type
		 * @return
		 */
		public static function hasListener( type:String ):Boolean {
			// 获取该事件类型对应的回调函数集合
			var array:Array = listeners[ type ];
			// 如果回调函数集合不存在,则创建,并进行存储
			if ( !array || array.length == 0 ) {
				return false;
			}
			return true;
		}
		/**
		 * 删除指定事件类型的所有监听器
		 * @param	type
		 */
		public static function removeListener( type:String ):void {
			// 获取该事件类型对应的回调函数集合
			var array:Array = listeners[ type ];
			// 如果回调函数集合不存在,则创建,并进行存储
			if ( !array ) {
				array = [];
				listeners[ type ] = array;
			}
			// 将函数关联删掉
			array.length = 0;
		}
		/**
		 * 删除指定事件类型和回调函数的监听器
		 * @param	type
		 * @param	callback
		 */
		public static function removeListenerFun( type:String, callback:Function ):void {
			// 获取该事件类型对应的回调函数集合
			var array:Array = listeners[ type ];
			// 如果回调函数集合不存在,则创建,并进行存储
			if ( !array ) {
				array = [];
				listeners[ type ] = array;
			}
			// 检查监听函数是否存在,如果存在则删除
			for ( var i:int = 0; i < array.length; i++ ) {
				if ( array[i] == callback ) {
					array.splice(i,1);
				}
			}
		}
		/**
		 * 删除所有指定事件类型的监听器
		 */
		public static function removeAllListeners():void {
			// 获取所有事件类型对应的回调函数集合
			for ( var i:int = 0; i < listeners.length; i++ ) {
				var array:Array = listeners[i];
				// 如果回调函数集合不存在,则创建,并进行存储
				if ( !array ) {
					array = [];
				}
				// 将函数关联删掉
				array.length = 0;
			}
		}
		/**
		 * 发出事件
		 * @param	type
		 * @param	object
		 */
		public static function dispatch(type:String, object:Object = null):void {
			var array:Array = listeners[type];
			for ( var j:int = 0; j < array.length; j++ ) {
				if (object) {
					( array[j] as Function ).call( null, object );
				} else {
					( array[j] as Function ).call();
				}
			}
		}
		
	}
}